/**
 * 身份验证控制器
 * 处理用户注册、登录和身份验证相关功能
 */

const User = require('../models/User');

/**
 * @desc    注册用户
 * @route   POST /api/auth/register
 * @access  公开
 */
exports.register = async (req, res) => {
  try {
    const { username, password, role } = req.body;
    
    // 创建用户
    const user = await User.create({
      username,
      password,
      role: role || 'user' // 默认为普通用户
    });
    
    // 生成并返回JWT令牌
    sendTokenResponse(user, 201, res);
  } catch (err) {
    res.status(400).json({
      success: false,
      message: err.message
    });
  }
};

/**
 * @desc    用户登录
 * @route   POST /api/auth/login
 * @access  公开
 */
exports.login = async (req, res) => {
  try {
    const { username, password } = req.body;
    
    // 验证请求体
    if (!username || !password) {
      return res.status(400).json({
        success: false,
        message: '请提供用户名和密码'
      });
    }
    
    console.log('登录尝试:', { username });
    
    // 查找用户并包含密码字段
    const user = await User.findOne({ username }).select('+password');
    
    // 检查用户是否存在
    if (!user) {
      console.log('用户不存在:', username);
      return res.status(401).json({
        success: false,
        message: '无效的凭据'
      });
    }
    
    console.log('找到用户:', { username: user.username, role: user.role });
    
    // 验证密码
    const isMatch = await user.matchPassword(password);
    
    console.log('密码验证结果:', isMatch);
    
    if (!isMatch) {
      return res.status(401).json({
        success: false,
        message: '无效的凭据'
      });
    }
    
    // 生成并返回JWT令牌
    sendTokenResponse(user, 200, res);
  } catch (err) {
    console.error('登录错误:', err);
    res.status(500).json({
      success: false,
      message: '登录失败'
    });
  }
};

/**
 * @desc    获取当前登录用户
 * @route   GET /api/auth/me
 * @access  私有
 */
exports.getMe = async (req, res) => {
  try {
    const user = await User.findById(req.user.id);
    
    res.status(200).json({
      success: true,
      data: user
    });
  } catch (err) {
    res.status(500).json({
      success: false,
      message: '无法获取用户信息'
    });
  }
};

/**
 * @desc    退出登录
 * @route   GET /api/auth/logout
 * @access  私有
 */
exports.logout = (req, res) => {
  // 清除cookie中的token
  res.cookie('token', 'none', {
    expires: new Date(Date.now() + 10 * 1000), // 10秒后过期
    httpOnly: true
  });
  
  res.status(200).json({
    success: true,
    message: '用户已退出登录'
  });
};

/**
 * 生成JWT令牌并发送响应
 * @param {Object} user - 用户对象
 * @param {Number} statusCode - HTTP状态码
 * @param {Object} res - 响应对象
 */
const sendTokenResponse = (user, statusCode, res) => {
  // 生成令牌
  const token = user.getSignedJwtToken();
  
  // 设置cookie选项
  const options = {
    expires: new Date(
      Date.now() + process.env.JWT_COOKIE_EXPIRE * 24 * 60 * 60 * 1000 // 转换为毫秒
    ),
    httpOnly: true // 仅服务器可访问cookie
  };
  
  // 在生产环境中使用安全cookie
  if (process.env.NODE_ENV === 'production') {
    options.secure = true;
  }
  
  // 发送响应
  res
    .status(statusCode)
    .cookie('token', token, options)
    .json({
      success: true,
      token
    });
}; 